/**
 * 构造矩阵使得D题的答案不是N+M-2，也不是N*M-1，也不是-1，且不存在绝对众数。
 * 只需要构造一条可行路线即可，按照如下方案构造。
 * a...........a
 * b...........b
 * a...........a
 * b...........b
 * xxyaaaaaaaaaa
 * yzzxyxyxyxyxy
 * 首先从第0列走到底，然后再转折两次，再从最后一行走到目的地即可
 * 为了防止其他通路，将a和b交替充满行即可
 */
#include <bits/stdc++.h>
using namespace std;

using pii = pair<int, int>;

int const DR[] = {-1, 1, 0, 0};
int const DC[] = {0, 0, -1, 1};

int N, M;
vector<string> Board;
bool Swap;

void proc33(){
    Board[0] = "abc";
    Board[1] = "aba";
    Board[2] = "cca";
    return;
}

void proc(){
    Swap = false;
    if(N > M){
        swap(N, M); Swap = true;
    }

    Board.assign(N, string(M, '\0'));
    if(M == 3) return proc33();

    for(int i=0;i<N-2;i+=2){
        fill(Board[i].begin(), Board[i].end(), 'a');
        if(i + 1 < N - 2){
            fill(Board[i + 1].begin(), Board[i + 1].end(), 'b');
        }
    }
    
    int u = N - 2;
    int v = N - 1;

    Board[u][0] = Board[u][1] = 'x';
    Board[v][0] = 'y';
    Board[v][1] = 'z';
    Board[u][2] = 'y';
    Board[v][2] = 'z';
    for(int i=3;i<M;i+=2){
        Board[u][i] = 'x';
        Board[v][i] = 'y';
        if(i + 1 < M){
            Board[u][i + 1] = 'y';
            Board[v][i + 1] = 'x';
        }
    }
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> N >> M;
    proc();
    if(Swap){
        for(int i=0;i<M;++i){
            for(int j=0;j<N;++j){
                cout << Board[j][i];
            }
            cout << "\n";
        }
    }else{
        for(const auto & s : Board) cout << s << "\n";
    }
    
    return 0;
}
